package fr.uniscol.siecle.parsers;

import java.io.File;
import java.util.Iterator;

import org.jdom2.Document;
import org.jdom2.Element;

import fr.uniscol.siecle.model.Bourse;
import fr.uniscol.siecle.model.Contrat;
import fr.uniscol.siecle.model.FichierSIECLE;
import fr.uniscol.siecle.model.LienParente;
import fr.uniscol.siecle.model.MEF;
import fr.uniscol.siecle.model.Matiere;
import fr.uniscol.siecle.model.ModaliteElection;
import fr.uniscol.siecle.model.MotifSortie;
import fr.uniscol.siecle.model.Nomenclatures;
import fr.uniscol.siecle.model.OptionObligatoire;
import fr.uniscol.siecle.model.PCSSituationEmploi;
import fr.uniscol.siecle.model.Profession;
import fr.uniscol.siecle.model.Programme;
import fr.uniscol.siecle.model.Provenance;
import fr.uniscol.siecle.model.Regime;
import fr.uniscol.siecle.model.SituationEmploi;
import fr.uniscol.siecle.model.StatutEleve;
import fr.uniscol.siecle.model.TypeEtablissement;

public class FichierSIECLENomenclaturesParser extends IFichierSIECLEParser {

	@Override
	public FichierSIECLE buildModel(Document doc, ParsingResults results) {
		
		Nomenclatures model = new Nomenclatures();
		
		Element eDonnees = doc.getRootElement().getChild("DONNEES");
		Element eMefs = eDonnees.getChild("MEFS");
		Element eMatieres = eDonnees.getChild("MATIERES");
		Element eModalites = eDonnees.getChild("MODALITES_ELECTION");
		Element eProgrammes = eDonnees.getChild("PROGRAMMES");
		Element eOptionsObligatoires = eDonnees.getChild("OPTIONS_OBLIGATOIRES");
		Element eRegimes = eDonnees.getChild("REGIMES");
		Element eLiensParente = eDonnees.getChild("LIENS_PARENTE");
		Element eBourses = eDonnees.getChild("BOURSES");
		Element eProfessions = eDonnees.getChild("PROFESSIONS");
		Element eSituations = eDonnees.getChild("SITUATIONS_EMPLOI");
		Element ePcs = eDonnees.getChild("PCS_SITUATIONS_EMPLOI");
		Element eProvenances = eDonnees.getChild("PROVENANCES");
		Element eMotifs = eDonnees.getChild("MOTIFS_SORTIE");
		Element eStatus = eDonnees.getChild("STATUTS_ELEVE");
		Element eContrats = eDonnees.getChild("CONTRATS");
		Element eTypesEtab = eDonnees.getChild("TYPES_ETABLISSEMENT");
		
		// ///////////////////////////////////////////////////////////////////////////////////
		MEF mef = null;
		Iterator<Element> ite = eMefs.getChildren().iterator();
		Element eMef = null;
		while(ite.hasNext()){
			eMef = ite.next();
			
			mef = new MEF();
			mef.setCode(eMef.getAttributeValue("CODE_MEF"));
			mef.setFormation(eMef.getChildText("FORMATION"));
			mef.setSpecialite(eMef.getChildText("SPECIALITE"));
			mef.setLibelle_long(eMef.getChildText("LIBELLE_LONG"));
			mef.setStatut_mef(eMef.getChildText("STATUT_MEF"));
			mef.setCode_mefstat(eMef.getChildText("CODE_MEFSTAT"));
			mef.setNb_opt_oblig(eMef.getChildText("NB_OPT_OBLIG"));
			mef.setNb_opt_mini(eMef.getChildText("NB_OPT_MINI"));
			mef.setRenforcement_langues(eMef.getChildText("RENFORCEMENT_LANGUES"));
			mef.setInscription_etab(eMef.getChildText("INSCRIPTION_ETAB"));
			mef.setMef_origine(eMef.getChildText("MEF_ORIGINE"));
			mef.setDate_ouverture(eMef.getChildText("DATE_OUVERTURE"));
			mef.setDate_fermeture(eMef.getChildText("DATE_FERMETURE"));
			
			model.getMefs().add(mef);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Matiere matiere = null;
		ite = eMatieres.getChildren().iterator();
		Element eMat = null;
		while(ite.hasNext()){
			eMat = ite.next();
			
			matiere = new Matiere();
			matiere.setCode(eMat.getAttributeValue("CODE_MATIERE"));
			matiere.setCode_gestion(eMat.getChildText("CODE_GESTION"));
			matiere.setLibelle_court(eMat.getChildText("LIBELLE_COURT"));
			matiere.setLibelle_long(eMat.getChildText("LIBELLE_LONG"));
			matiere.setLibelle_edition(eMat.getChildText("LIBELLE_EDITION"));
			matiere.setMatiere_etp(eMat.getChildText("MATIERE_ETP"));
			
			model.getMatieres().add(matiere);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		ModaliteElection modalite = null;
		Element eMod = null;
		ite = eModalites.getChildren().iterator();
		while(ite.hasNext()){
			eMod = ite.next();
			
			modalite = new ModaliteElection();
			modalite.setCode(eMod.getAttributeValue("CODE_MODALITE_ELECT"));
			modalite.setLibelle_court(eMod.getChildText("LIBELLE_COURT"));
			modalite.setLibelle_long(eMod.getChildText("LIBELLE_LONG"));
			
			model.getModalites().add(modalite);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		OptionObligatoire opt = null;
		Element eOpt = null;
		ite = eOptionsObligatoires.getChildren().iterator();
		while(ite.hasNext()){
			eOpt = ite.next();
			
			opt = new OptionObligatoire();
			opt.setMef(model.findMef(eOpt.getChildText("CODE_MEF")));
			opt.setMatiere(model.findMatiere(eOpt.getChildText("CODE_MATIERE")));
			opt.setRang_option(eOpt.getChildText("RANG_OPTION"));
			
			model.getOptionsObligatoires().add(opt);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Programme prog = null;
		Element eProg = null;
		ite = eProgrammes.getChildren().iterator();
		while(ite.hasNext()){
			eProg = ite.next();
			
			prog = new Programme();
			prog.setMef(model.findMef(eProg.getChildText("CODE_MEF")));
			prog.setMatiere(model.findMatiere(eProg.getChildText("CODE_MATIERE")));
			prog.setModalite(model.findModalite(eProg.getChildText("CODE_MODALITE_ELECT")));
			prog.setHoraire(eProg.getChildText("HORAIRE"));
			
			model.getProgrammes().add(prog);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Regime reg = null;
		Element eReg = null;
		ite = eRegimes.getChildren().iterator();
		while(ite.hasNext()){
			eReg = ite.next();
			
			reg = new Regime();
			reg.setCode(eReg.getAttributeValue("CODE_REGIME"));
			reg.setLibelle_court(eReg.getChildText("LIBELLE_COURT"));
			reg.setLibelle_long(eReg.getChildText("LIBELLE_LONG"));
			
			model.getRegimes().add(reg);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		LienParente li = null;
		Element eLi = null;
		ite = eLiensParente.getChildren().iterator();
		while(ite.hasNext()){
			eLi = ite.next();
			
			li = new LienParente();
			li.setCode(eLi.getAttributeValue("CODE_PARENTE"));
			li.setLibelle_court(eLi.getChildText("LIBELLE_COURT"));
			li.setLibelle_long(eLi.getChildText("LIBELLE_LONG"));
			
			model.getLiensParente().add(li);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Bourse br = null;
		Element eBo = null;
		ite = eBourses.getChildren().iterator();
		while(ite.hasNext()){
			eBo = ite.next();
			
			br = new Bourse();
			br.setCode(eBo.getAttributeValue("CODE_BOURSE"));
			br.setLibelle_court(eBo.getChildText("LIBELLE_COURT"));
			br.setLibelle_long(eBo.getChildText("LIBELLE_LONG"));
			
			model.getBourses().add(br);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Profession pr = null;
		Element ePr = null;
		ite = eProfessions.getChildren().iterator();
		while(ite.hasNext()){
			ePr = ite.next();
			
			pr = new Profession();
			pr.setCode(ePr.getAttributeValue("CODE_PROFESSION"));
			pr.setLibelle_court(ePr.getChildText("LIBELLE_COURT"));
			pr.setLibelle_long(ePr.getChildText("LIBELLE_LONG"));
			
			model.getProfessions().add(pr);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		SituationEmploi sit = null;
		Element eSit = null;
		ite = eSituations.getChildren().iterator();
		while(ite.hasNext()){
			eSit = ite.next();
			
			sit = new SituationEmploi();
			sit.setCode(eSit.getAttributeValue("CODE_SITUATION"));
			sit.setLibelle_court(eSit.getChildText("LIBELLE_COURT"));
			sit.setLibelle_long(eSit.getChildText("LIBELLE_LONG"));
			sit.setTrans_situation(eSit.getChildText("TRANS_SITUATION"));
			
			model.getSituationsEmploi().add(sit);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		PCSSituationEmploi pcs = null;
		Element ep = null;
		ite = ePcs.getChildren().iterator();
		while(ite.hasNext()){
			ep = ite.next();
			
			pcs = new PCSSituationEmploi();
			pcs.setProfession(model.findProfession(ep.getChildText("CODE_PROFESSION")));
			pcs.setSituation(model.findSituation(ep.getChildText("CODE_SITUATION")));
			
			model.getPcsSituationEmploi().add(pcs);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Provenance pro = null;
		Element ePro = null;
		ite = eProvenances.getChildren().iterator();
		while(ite.hasNext()){
			ePro = ite.next();
			
			pro = new Provenance();
			pro.setCode(ePro.getAttributeValue("CODE_PROVENANCE"));
			pro.setLibelle_court(ePro.getChildText("LIBELLE_COURT"));
			pro.setLibelle_long(ePro.getChildText("LIBELLE_LONG"));
			
			model.getProvenances().add(pro);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		MotifSortie mot = null;
		Element eMot = null;
		ite = eMotifs.getChildren().iterator();
		while(ite.hasNext()){
			eMot = ite.next();
			
			mot = new MotifSortie();
			mot.setCode(eMot.getAttributeValue("CODE_MOTIF_SORTIE"));
			mot.setLibelle_court(eMot.getChildText("LIBELLE_COURT"));
			mot.setLibelle_long(eMot.getChildText("LIBELLE_LONG"));
			
			model.getMotifsSortie().add(mot);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		StatutEleve st = null;
		Element eSt = null;
		ite = eStatus.getChildren().iterator();
		while(ite.hasNext()){
			eSt = ite.next();
			
			st = new StatutEleve();
			st.setCode(eSt.getAttributeValue("CODE_STATUT"));
			st.setLibelle_court(eSt.getChildText("LIBELLE_COURT"));
			st.setLibelle_long(eSt.getChildText("LIBELLE_LONG"));
			
			model.getStatutsEleve().add(st);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		Contrat ct = null;
		Element eCt = null;
		ite = eContrats.getChildren().iterator();
		while(ite.hasNext()){
			eCt = ite.next();
			
			ct = new Contrat();
			ct.setCode(eCt.getAttributeValue("CODE_CONTRAT"));
			ct.setLibelle_court(eCt.getChildText("LIBELLE_COURT"));
			ct.setLibelle_long(eCt.getChildText("LIBELLE_LONG"));
			
			model.getContrats().add(ct);
		}
		
		/////////////////////////////////////////////////////////////////////////////////////
		
		TypeEtablissement te = null;
		Element eTy = null;
		ite = eTypesEtab.getChildren().iterator();
		while(ite.hasNext()){
			eTy = ite.next();
			
			te = new TypeEtablissement();
			te.setCode(eTy.getAttributeValue("CODE_TYPE_ETAB"));
			te.setLibelle_court(eTy.getChildText("LIBELLE_COURT"));
			te.setLibelle_long(eTy.getChildText("LIBELLE_LONG"));
			
			model.getTypesEtablissement().add(te);
		}
		
		return model;
	}
}
